package com.szxx.suit;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import com.szxx.constans.PokerGameConstant;

/**
 * 分析计数器 <br>
 *
 * @author Ambrose
 */
public class AnalyzerCounter {

	/**
	 * 点数value ---》 个数，记录某点数的数量 <br>
	 * 比如出牌 3334448A 最终会记录 3有3张，4有3张，8有1张，14有1张这样
	 */
	private Map<Integer, Integer> counter = new HashMap<Integer, Integer>();
	
	/**
	 * 增加某点数的个数
	 * 
	 * @param value
	 * @return
	 */
	public void addValueCount(int value) {
		Integer count = counter.get(value);
		if (count == null) {
			counter.put(value, 1);
		} else {
			counter.put(value, count.intValue() + 1);
		}
	}
	
	/**
	 * 获取某点数的个数
	 * 
	 * @param value
	 * @return
	 */
	public int getValueCount(int value) {
		Integer count = counter.get(value);
		if (count == null) {
			return 0;
		} else {
			return count.intValue();
		}
	}
	
	/**
	 * 获取张数为count 的点数值
	 * 
	 * @param count
	 * @return 不会返回 null 或者 带null元素 的 list
	 */
	public List<Integer> getValuesInCount(int count) {
		List<Integer> numbers = new ArrayList<Integer>();
		for (Entry<Integer, Integer> entry : counter.entrySet()) {
			Integer entryNumber = entry.getKey();
			Integer entryCount = entry.getValue();
			if (entryNumber != null && entryCount != null && entryCount.intValue() == count) {
				numbers.add(entryNumber);
			}
		}
		Collections.sort(numbers);
		return numbers;
	}
	
	/**
	 * 获取张数为count 的点数值
	 * 
	 * @param count
	 * @return 不会返回 null 或者 带null元素 的 list
	 */
	public List<Integer> getAllValues() {
		List<Integer> numbers = new ArrayList<Integer>();
		for (Entry<Integer, Integer> entry : counter.entrySet()) {
			Integer entryNumber = entry.getKey();
			if (entryNumber != null) {
				numbers.add(entryNumber);
			}
		}
		Collections.sort(numbers);
		return numbers;
	}
	
	/**
	 * 清理回收
	 */
	public void clear() {
		counter.clear();
	}
	
	public boolean hasJoker() {
		if (getValueCount(PokerGameConstant.RED_JOKER_SHAPE_VALUE) > 0
				|| getValueCount(PokerGameConstant.BLACK_JOKER_SHAPE_VALUE) > 0) { // 含有大小王
			return true;
		} else {
			return false;
		}
	}

	// -------------------getter & setter--------------------------
	public Map<Integer, Integer> getCounter() {
		return counter;
	}

	public void setCounter(Map<Integer, Integer> valueCounter) {
		this.counter = valueCounter;
	}
	
}
